Метод Эйлера
Метод Эйлера — простейший численный метод решения систем обыкновенных дифференциальных уравнений. Впервые описан Леонардом Эйлером в 1768 году в работе «Интегральное исчисление»[1]. Метод Эйлера является явным, одношаговым методом первого порядка точности. Он основан на аппроксимации интегральной кривой кусочно-линейной функцией — так называемой ломаной Эйлера.
Описание метода
[править | править код]Пусть дана задача Коши для уравнения первого порядка:
где функция определена на некоторой области . Решение ищется на полуинтервале . На этом промежутке введём узлы Приближенное решение в узлах , которое обозначим через , определяется по формуле
Эти формулы непосредственно обобщаются на случай систем обыкновенных дифференциальных уравнений.
Оценка погрешности метода на шаге и в целом
[править | править код]Погрешность на шаге, или локальная погрешность, — это разность между численным решением после одного шага вычисления и точным решением в точке . Численное решение задаётся формулой
Точное решение можно разложить в ряд Тейлора:
Локальную ошибку получаем, вычитая из второго равенства первое:
Это справедливо, если имеет непрерывную вторую производную[2]. Другим достаточным условием справедливости этой оценки, из которого вытекает предыдущее и которое обычно может быть легко проверено, является непрерывная дифференцируемость по обоим аргументам[3].
Погрешность в целом, глобальная или накопленная погрешность — это погрешность в последней точке произвольного конечного отрезка интегрирования уравнения. Для вычисления решения в этой точке требуется шагов, где — длина отрезка. Поэтому глобальная погрешность метода .
Таким образом, метод Эйлера является методом первого порядка — имеет погрешность на шаге и погрешность в целом [3].
Значение метода Эйлера
[править | править код]Метод Эйлера являлся исторически первым методом численного решения задачи Коши. О. Коши использовал этот метод для доказательства существования решения задачи Коши. Ввиду невысокой точности и вычислительной неустойчивости для практического нахождения решений задачи Коши метод Эйлера применяется редко. Однако в виду своей простоты метод Эйлера находит своё применение в теоретических исследованиях дифференциальных уравнений, задач вариационного исчисления и ряда других математических проблем.
Модификации и обобщения
[править | править код]Модифицированный метод Эйлера с пересчетом
[править | править код]Повысить точность и устойчивость вычисления решения можно с помощью явного метода Эйлера следующего вида.
Прогноз:
- .
Коррекция:
- .
Для повышения точности корректирующую итерацию можно повторить, подставляя .
Модифицированный метод Эйлера с пересчетом имеет второй порядок точности, однако для его реализации необходимо как минимум дважды вычислять . Метод Эйлера с пересчетом представляет собой разновидность методов Рунге-Кутты (предиктор-корректор).
Двухшаговый метод Адамса — Башфорта
[править | править код]Другой способ повысить точность метода заключается в использовании не одного, а нескольких вычисленных ранее значений функции:
Это линейный многошаговый метод.
Реализации на языках программирования
[править | править код]Реализация на языке Си для функции.
#include <stdio.h> // printf()
#include <stdlib.h> // EXIT_SUCCESS
// функция первой производной
double f( double const x, double const y ) { return 6 * x * x + 5 * x * y; }
// точка входа
int main()
{
double const h = .01; // размер шага
double x = 1; // x_0
double y = 1; // y_0
int n = 10; // количество итераций
// итерации по методу Эйлера
for ( ; n--; y += h * f( x, y ), x += h );
// печать результата
printf( "x:\t%-5.7lf\ny:\t%-5.7lf", x, y );
// выход
return EXIT_SUCCESS;
}
Реализация на языке Python 3.7:
# n - количество итераций, h - шаг, (x, y) - начальная точка
def Euler(n = 10, h = 0.01, x = 1, y = 1):
for i in range(n):
y += h * function(x, y)
x += h
return x, y # решение
def function(x, y):
return 6 * x**2 + 5 * x * y # функция первой производной
print(Euler())
Реализация на языке Lua:
n, h, x, y = 10, 0.01, 1, 1 -- количество итераций, шаг, координаты начальной точки
function f (x, y) return 6*x^2+5*x*y end -- функция первой производной
for i = 1, n do
x, y = x + h, y + h * f(x, y)
end
print('x: '..x..' y: '..y)
См. также
[править | править код]Примечания
[править | править код]- ↑ Эйлер Л. Интегральное исчисление, том 1, раздел 2, гл. 7.
- ↑ Atkinson, Kendall A. (1989), An Introduction to Numerical Analysis (2nd ed.), New York: John Wiley & Sons, p. 342, ISBN 978-0-471-50023-0
- ↑ 1 2 Математический энциклопедический словарь. — М.: «Сов. энциклопедия », 1988. — С. 641.
Литература
[править | править код]- Эйлер Л. Интегральное исчисление. Том 1. — М.: ГИТТЛ. 1956. [1]
- Бабенко К. И. Основы численного анализа. — М.: Наука. 1986.